<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>函数类型</title>
    <script>
        function fn(){
            console.log("正在执行fn");
            // return "fn";
        }
        function f1(){
            // 将函数fn的返回值作为当前变量的值
            // 如果函数有返回值,则直接将返回值赋值给变量
            // 如果函数没有返回值,则直接返回undefined
            let f = fn();
            console.log(f);
            let ff = f2(1,2,3);
            console.log(ff);
        }
        // function f2(a,b){
        function f2(){
            // console.log(a+"+"+b+"="+(a+b));
            // return a+b;

            // 在函数中,其调用者所传递的参数并不是有函数的参数进行获取的
            // 而是由JavaScript所提供的一个内置对象arguments进行获取的
            // arguments是一个数组,所有的参数均在该数组中
            // 当前函数的参数只是为这个数组中的每一个元素取了一个别名
            // 根据参数的顺序去获取数组中对应索引位置的元素的值
            // 第一个参数相当于arguments[0]
            // 第二个参数相当于arguments[1]
            // 以此类推
            // 因此,函数的参数数量可以与调用者传递的参数数量不一致
            for(let i = 0; i < 3; i++){
                console.log("第"+(i+1)+"个参数为:"+arguments[i]);
            }
            let a = arguments[0];
            let b = arguments[1];
            let c = arguments[2];
            return a+b+c;
        }
        function f3(){
            let f = fn;
            console.log(typeof f);
        }
        function f4(){
            let f = function(){
                console.log("这是函数");
            };
            console.log(typeof f);
        }
        function f5(){
            // ES6新语法:lambda表达式
            // 语法:() => {函数内容}
            let a = function(){
                console.log("这是函数");
                return "fn";
            };
            console.log(typeof a);
            // b与a是一致的
            let b = () =>{
                console.log("这是函数");
                return "fn";
            };
            console.log(typeof b);

            console.log(a());
            console.log(b());


            let a2 = function(){
                return "a2";
            };
            console.log(typeof a2);
            // 当函数内容中只有返回值的时候
            // 可以进行简写,简写时省略{}与return关键字
            // 此时语法:() => "返回值"
            // b2与a2是一致的
            let b2 = () => "a2";
            console.log(typeof b2);
            console.log(a2());
            console.log(b2());
        }
    </script>
</head>
<body>
<button onclick="f1()">函数返回值</button><br/>
<button onclick="f2(1,2,3)">函数参数</button><br/>
<button onclick="f3()">函数定义方式一</button><br/>
<button onclick="f4()">函数定义方式二</button><br/>
<button onclick="f5()">函数定义方式三</button><br/>
</body>
</html>